package factory_pattern.f1;

/**
 * 简单的工厂模式：
 * 简单工厂模式进行实现该功能之后，会发现我们将游戏类的实例化放到了工厂类中实现，隐藏了对象创建的细节，
 * 并且不需要知道是怎么玩的，只需要知道调用该工厂类就行了。而且方便切换，因为只需更改工厂类传递的类型值就行了
 *
 * 缺点：如果我们需要新增一个游戏类，那么需要新定义一个接口，然后还要在工厂类中添加一个判断分支，
 * 如果少量的话还好，但是大量的话就比较麻烦了，并且这也违背了开放-封闭原则。
 */
public class Factory1 {
  private static final String LOL = "LOL";
  private static final String DNF = "DNF";

  public static void main(String[] args) {
    Game game= ComputerFactory.playGame(LOL);
    Game game2= ComputerFactory.playGame(DNF);
    game.play();
    game2.play();
  }
}

interface Game {
  void play();
}

class LOL implements Game {
  public void play() {
    System.out.println("正在玩LOL...");
  }
}

class DNF implements Game {
  public void play() {
    System.out.println("正在玩DNF...");
  }
}

class ComputerFactory {
  private static final String LOL = "LOL";
  private static final String DNF = "DNF";

  public static Game playGame(String game) {
    if (LOL.equalsIgnoreCase(game)) {
      return new LOL();
    } else if (DNF.equalsIgnoreCase(game)) {
      return new DNF();
    }
    return null;
  }
}